[アップデート] Amazon Cognito で高度なセキュリティを有効化した際にユーザーアクティビティログを外部サービスへ転送出来るようになりました
いわさです。
Amazon Cognito でユーザーのアクティビティログを管理したい場合があります。
CloudTrail から拾うか、あるいは有償オプションである高度なセキュリティ機能を有効化することで操作履歴の管理を行うことが出来ます。
そのあたりは以下の記事にまとまっています。
このようにアクティビティログを以前から確認する方法はあったのですが、先日のアップデートでどうやら Cognito の高度なセキュリティ機能が色々アップデートされたようで、その中の機能の一つとして高度なセキュリティ機能で記録されるユーザーアクティビティログをエクスポート出来るようになったようです。
アップデートアナウンス(What's New)はまだ出ていないですが、公式ドキュメントや API の更新履歴は既に公開されているので機能は利用可能です。
アナウンス出ていました。
本日はこちらを使ってみましたのでその様子を紹介します。
高度なセキュリティの有効化画面がちょっと変わってた
まずは前提となる「高度なセキュリティ(Advanced Security)」機能を有効化する必要があるのですが、どうやら今回のアップデートで画面が少しリニューアルされているようです。
以下は高度なセキュリティがまだ有効化されていないユーザープールの画面です。
なんかオシャレになってますよね。アクティブ化ボタンからアクティブ化しましょう。
ボタンを押すと次のような確認ダイアログが表示されました。
高度なセキュリティ機能をアクティブ化するとどういう機能が使えるようになるのかと、初期状態で何が有効状態なのかが表示されています。
今回のアップデートの対象は上記の枠部分で、デフォルトでは有効化されないようです。
高度なセキュリティ機能をアクティブ化したあとに、さらに追加の設定が必要ということですね。
高度なセキュリティ機能をアクティブ化すると次のような画面になります。このあたりもちょっとリニューアルされてますね。
この中に「ユーザーアクティビティログをエクスポート」という設定箇所がありました。セットアップしましょう。
ログ記録ステータスの「ユーザーアクティビティログのエクスポートをアクティブ化」にチェックを入れます。
そうするとログの記録先を設定することが出来るようになりまして、CloudWatch Logs、Data Firehose、S3 の 3 つからいずれかを選択出来るようです。
複数選択は出来ず、上記のいずれかになります。
今回は手軽にログ内容の確認が出来る CloudWatch Logs を設定してみました。
ロググループ選択画面の検索機能がうまく動いていない気がしましたが、リストから既存のロググループを選択します。
設定後、高度なセキュリティタブの表示が次のように変化しました。
設定完了したようですね。非常に簡単です。
アクティビティログを確認してみる
コンソールの情報からすると、これらの情報が取れるようです。実際に確認していきます。
ユーザープールに適当なユーザーを作成し、今回は AWS CLI から初期認証・パスワード認証・通常認証を行いました。
本題とは関係のない部分なのですがいつも AWS CLI のリファレンスを確認するのが面倒なのでコマンドを残しておきます。
## 管理者が用意した初期情報で初回の認証
% cat hoge.json
{
"AuthFlow": "USER_PASSWORD_AUTH",
"AuthParameters": {
"USERNAME": "hoge0808",
"PASSWORD": "111111"
},
"ClientId": "g0n17akfs8hkb8hmlqh38r9tg"
}
% aws cognito-idp initiate-auth --cli-input-json file://hoge.json
{
"ChallengeName": "NEW_PASSWORD_REQUIRED",
"Session": "hogehogehoge",
"ChallengeParameters": {
"USER_ID_FOR_SRP": "hoge0808",
"requiredAttributes": "[]",
"userAttributes": "{\"email_verified\":\"true\",\"email\":\"iwasa.takahito+hoge0808@example.com\"}"
}
}
## デフォルトパスワードからの変更を要求されるので変更対応
% aws cognito-idp respond-to-auth-challenge --generate-cli-skeleton > hoge2.json
% cat hoge2.json
{
"ClientId": "g0n17akfs8hkb8hmlqh38r9tg",
"ChallengeName": "NEW_PASSWORD_REQUIRED",
"Session": "hogehogehoge",
"ChallengeResponses": {
"USERNAME": "hoge0808",
"NEW_PASSWORD": "222222"
}
}
% aws cognito-idp respond-to-auth-challenge --cli-input-json file://hoge2.json
{
"ChallengeParameters": {},
"AuthenticationResult": {
"AccessToken": "hogehogehoge",
"ExpiresIn": 3600,
"TokenType": "Bearer",
"RefreshToken": "hogehogehoge",
"IdToken": "hogehogehoge"
}
}
# 変更後のパスワードで認証(成功)
% cat hoge.json
{
"AuthFlow": "USER_PASSWORD_AUTH",
"AuthParameters": {
"USERNAME": "hoge0808",
"PASSWORD": "222222"
},
"ClientId": "g0n17akfs8hkb8hmlqh38r9tg"
}
% aws cognito-idp initiate-auth --cli-input-json file://hoge.json
{
"ChallengeParameters": {},
"AuthenticationResult": {
"AccessToken": "hogehogehoge",
"ExpiresIn": 3600,
"TokenType": "Bearer",
"RefreshToken": "hogehogehoge",
"IdToken": "hogehogehoge"
}
}
# 変更後のパスワードで認証(失敗)
% cat hoge.json
{
"AuthFlow": "USER_PASSWORD_AUTH",
"AuthParameters": {
"USERNAME": "hoge0808",
"PASSWORD": "333333"
},
"ClientId": "g0n17akfs8hkb8hmlqh38r9tg"
}
% aws cognito-idp initiate-auth --cli-input-json file://hoge.json
An error occurred (NotAuthorizedException) when calling the InitiateAuth operation: Incorrect username or password.
うむ。良いですね。
CloudWatch Logs を確認してみると認証操作にあわせてそれぞれログが出力されていました。
ログの構造は次のような形です。
{
"eventTimestamp": "1723070073369",
"eventSource": "USER_AUTH_EVENTS",
"logLevel": "INFO",
"message": {
"version": "1",
"eventId": "7f151463-1488-428f-a5c1-9f9c80cf2114",
"eventType": "SignIn",
"userSub": "0784fae8-c051-70ff-b12c-0e32600fdd02",
"userName": "hoge0808",
"userPoolId": "ap-northeast-1_EcsdFoftu",
"clientId": "g0n17akfs8hkb8hmlqh38r9tg",
"creationDate": "Wed Aug 07 22:34:33 UTC 2024",
"eventResponse": "InProgress",
"riskLevel": "",
"riskDecision": "PASS",
"challenges": [
"Password:Success"
],
"deviceName": "Other, Other",
"ipAddress": "xxxx:xx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx",
"requestId": "7f151463-1488-428f-a5c1-9f9c80cf2114",
"idpName": "",
"compromisedCredentialDetected": "false",
"city": "Sapporo",
"country": "Japan",
"eventFeedbackValue": "",
"eventFeedbackDate": "",
"eventFeedbackProvider": ""
},
"logSourceId": {
"userPoolId": "ap-northeast-1_EcsdFoftu"
}
}
アクセス元の Country や City が表示されています。
私が札幌からアクセスしたということがバレていますね。厳密には江別ですが、ほぼ札幌みたいなものなので正確度は問題なさそうです。
これらを CloudWatch Lgos Insights で情報を絞って履歴化してみました。
良いですね。簡単に Cognito 以外でアクティビティログを分析出来るようになりました。Data Firehose などと連携して SIEM などとの連携も出来そうです。
ちなみに、Cognito コンソールのユーザーイベント履歴とほぼ同じ情報が確認出来ました。
エクスポートされたログの場合だと結果だけでなく InProgress の情報もレコードとして分かれていますね。
ユーザ−アクティビティログのエクスポート機能ですが、料金は通常の高度なセキュリティ機能の範囲で利用が可能です。出力先のログストレージ・ストリーム側の料金は別途発生するのでそちらだけ見込んでおきましょう。
さいごに
本日は Amazon Cognito で高度なセキュリティを有効化した際にユーザーアクティビティログを外部サービスへ転送出来るようになったので使ってみました。
高度なセキュリティ機能の利用が前提ではありますが、これ欲しかった方多いのではないでしょうか。是非使ってみてください。